package com.hqyj.springBoot.modules.common.service.impl;

import com.hqyj.springBoot.modules.common.entity.ImageType;
import com.hqyj.springBoot.modules.common.entity.ResourceConfigBean;
import com.hqyj.springBoot.modules.common.entity.ResultEntity;
import com.hqyj.springBoot.modules.common.service.ImageService;
import com.hqyj.springBoot.util.FileUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;

/**
 * @author yun
 * @date 2021-5-5 13:10
 */
@Service
public class ImageServiceImpl implements ImageService {

    private final static Logger LOGGER = LoggerFactory.getLogger(ImageServiceImpl.class);
    @Value("${artifactId}")
    private String artifactId;
    @Autowired
    private ResourceConfigBean resourceConfigBean;

    @Override
    public ResultEntity<String> uploadImage(MultipartFile image, String type) {
        //判断图片是否为空
        if(image.isEmpty()){
            return new ResultEntity<>(ResultEntity.ResultStatus.FAILED.status,"请选择图片！");
        }
        //判断file是否是图片
        if(!FileUtil.isImage(image)){
            return new ResultEntity<>(ResultEntity.ResultStatus.FAILED.status,"请选择图片！");
        }

        // 获取图片枚举类型
        ImageType imageType = ImageType.getImageTypeByName(type);

        //确定目标绝对路径
        //第一个：基础资源文件包，第二个：项目包名 第三个：图片类型的包名
        String destFolderPath = String.format("%s%s/%s",
                System.getProperty("os.name").toLowerCase().startsWith("win") ?
                        resourceConfigBean.getLocalPathForWindow() :
                        resourceConfigBean.getLocalPathForLinux(),
                artifactId,
                imageType.type);
        File destFolderFile = new File(destFolderPath);
        //判断目标文件是否存在，不存在就创建
        if(!destFolderFile.exists()){
            destFolderFile.mkdirs();
        }

        //文件名以当前时间为准
        //第一个：基础的文件包，第二个： 文件名称
        String fileName = String.format("%s.%s",
                System.currentTimeMillis(),
                FileUtil.getFileType(image.getOriginalFilename()));
        //斜杠是根据资源的后缀加上的
        String destFilePath = String.format("%s/%s",destFolderFile,fileName);

        //确定文件的相对位置
        //相对路径 相对的地址、文件类型、文件名
        String relateFilePath = String.format("%s%s/%s/%s",
                resourceConfigBean.getResourcePath(),
                artifactId,
                imageType.type,
                fileName);
        LOGGER.debug("absolutePath: " + destFilePath);
        LOGGER.debug("relatedPath: " + relateFilePath);

        //移植图片文件
        try {
            // 移植图片文件并修改文件大小
            image.transferTo(new File(destFilePath));
            FileUtil.changeImageSize(destFilePath, destFilePath, imageType.width, imageType.length);
        } catch (IllegalStateException | IOException e) {
            e.printStackTrace();
            return new ResultEntity<>(ResultEntity.ResultStatus.FAILED.status, "图片上传失败！");
        }
        //返回结果路径
        return new ResultEntity<>(ResultEntity.ResultStatus.SUCCESS.status, "图片上传成功！",relateFilePath);
    }
}
